package com.itheima.ydd.controller;


import com.itheima.ydd.common.ResultData;
import com.itheima.ydd.entity.YddFile;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 文件资源上传下载类
 */
@RestController
@RequestMapping("common")
@Slf4j
public class CommonController {

    //注入文件路径
    @Value("${ydd.path}")
    private String basePath;

    /**
     * 文件上传功能
     * @param type 文件类型
     * @param file  文件
     * @return  文件属性
     */
    @PostMapping("upload")
    public ResultData upload(String type,MultipartFile file){
        log.info("要保存的文件类型为:{},文件为:{}",type,file);
        //创建文件对象
        YddFile yddFile=new YddFile();

        //获取当前文件的后缀名
        String originalName = file.getOriginalFilename();
        String suffix = originalName.substring(originalName.lastIndexOf("."));

        //使用UUID生成文件名,防止文件名重复覆盖
        String fileName = UUID.randomUUID() + suffix;
        log.info("文件名为:{}", fileName);

        yddFile.setName(fileName);
        yddFile.setSavePath("/common/images/"+fileName);
        yddFile.setMime(type);
        yddFile.setSize(file.getSize());

        //判断文件储存路径是否存在,不存在则创建
        File dir = new File(basePath);
        if (!dir.exists()) dir.mkdirs();

        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd/");
        String date = sdf.format(new Date());
        log.info("日期为:{}",date);

        //将文件存储到指定位置
        try {
            log.info("文件存储位置:{}{}", basePath, fileName);
            file.transferTo(new File(basePath + fileName));

        } catch (IOException e) {
            e.printStackTrace();
        }
        log.info("存储的文件为:{}",yddFile);
        return ResultData.ok("",yddFile);
    }


    /**
     * 重前端获取文件名后读取本地文件并回显到页面
     * @param name  文件名
     * @param response  响应对象,发送文件到页面
     */
    @GetMapping("images/{name}")
    public void getImg(@PathVariable String name, HttpServletResponse response){
        //从本地读取文件try-with结构,自动关流
        try(FileInputStream fis=new FileInputStream(basePath+name)) {
            //使用io工具类将文件的流读取到响应输出流中
            IOUtils.copy(fis,response.getOutputStream());
        } catch (IOException e) {
            log.info("文件不存在");
            e.printStackTrace();
        }
    }


}
